home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Guardian.c
-
- Contains: Don't let them slip past…
-
- Written by: Guy Riddle
-
- Copyright: © 1995 by Apple Computer, Inc., all rights reserved.
- */
-
- #include <Types.h>
- #include <QuickDraw.h>
- #include <Fonts.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Dialogs.h>
- #include <Desk.h>
- #include <ToolUtils.h>
- #include <Memory.h>
- #include <SegLoad.h>
- #include <Files.h>
- #include <Folders.h>
- #include <OSUtils.h>
- #include <DiskInit.h>
- #include <Scrap.h>
- #include <Sound.h>
- #include <Resources.h>
- #include <AppleEvents.h>
-
- #include <String.h>
- #include <Strings.h>
- #include <stdio.h>
-
- #include <QuickTimeConferencing.h>
-
- #include "See.h"
-
- typedef EventRecord *EventRecordPtr;
- typedef Byte *BytePtr;
- typedef AppleEvent *AppleEventPtr;
- typedef Boolean *BooleanPtr;
- typedef void *VoidPtr;
-
- #define PW_CLEAR 'pw-C'
- #define kMTNameType 'mtnm'
- #define kMTNameListType 'mtnl'
-
- #define kCheckInterval 66
- #define kBleepInterval 55
-
- #define kBorderSize 4
- #define kBarHeight 16
-
- typedef struct {
- QElemPtr qLink;
- Rect box;
- MTConferenceMember member;
- MTControllerComponent controller;
- long sizes[5];
- #define kBase 0
- #define kOldest 1
- #define kPrevious 3
- #define kNewest 4
- RgnHandle border;
- Boolean bleeping;
- } Member, *MemberPtr;
-
- Boolean gQuitNow;
- QHdr gMembers;
-
- MTCString63 gUserName, gPassword;
-
- ComponentInstance gCC, gBC;
-
- Rect gStandardScreen = { 100, 100, 220, 260 };
-
- SndChannelPtr gSoundChannel;
- Handle gBleepSound;
- long gBleepTime, gCheckTime;
- Boolean gBleeping;
- MTControllerActionFilterUPP gGetInOnTheActionUPP;
- MTMediaUPP gSpyProcUPP;
- MemberPtr FindMember(MTConferenceMember);
- MemberPtr FindMemberWindow(WindowPtr);
- MemberPtr FindController(MTControllerComponent);
-
- void Initialize(void);
- void StartMovieTalk(void);
- pascal OSErr HandleOAPP(AppleEventPtr, AppleEventPtr, long);
- pascal OSErr HandleODOC(AppleEventPtr, AppleEventPtr, long);
- void FileCall(FSSpecPtr);
- pascal OSErr HandleQUIT(AppleEventPtr, AppleEventPtr, long);
- void StopMovieTalk(void);
- void EventLoop(void);
-
- void DoToolboxEvent(EventRecordPtr);
- void DoKeyDownEvent(EventRecordPtr);
- void DoUpdateEvent(EventRecordPtr);
- void DoMouseDownEvent(EventRecordPtr);
- void DoDiskEvent(EventRecordPtr);
- void AdjustMenus(void);
- void DoMenuBar(long);
- void DoAppleMenu(short);
- void DoFileMenu(short);
- void DoMenuCall(void);
- void DoMenuHangUp(WindowPtr);
- void DoMenuSave(int, ResType, WindowPtr);
- void SaveScreen(WindowPtr);
-
- void DoConferenceEvent(MTConferenceEventPtr);
- void DoConfReady(MTConferenceEventPtr);
- void DoMemberReady(MTConferenceEventPtr);
- pascal Boolean GetInOnTheAction(MTControllerComponent, MTControllerActionType, VoidPtr, long);
- void DoMemberTerminated(MTConferenceEventPtr);
- void DoPhoneRinging(MTConferenceEventPtr);
- void DoMemberJoining(MTConferenceEventPtr);
- Boolean Requires(MTConferenceMember, OSType);
- Handle GetPassword(Ptr);
- void EnableButton(DialogRef, short, Boolean);
- void GetValue(BytePtr, DialogRef, short);
-
- pascal OSErr SpyProc(MTStreamChunkRecordPtr);
- void IntruderCheck(void);
- Boolean ShouldBleep(MemberPtr);
- void BleepAgain(void);
-
- MemberPtr CallOne(MTNamePtr);
- void SaveMovie(Handle);
- void SaveSnapshot(Handle);
- void Sorry(int, int, MTConferenceMember, OSErr);
-
- /*
- * WeSeeYou
- *
- * This conferencing application is receive only. It doesn't accept incoming calls or transmit
- * any media data. It is basically a motion detector.
- *
- * • Required Apple Events are supported (well, not printing)
- *
- * • You can save a "monitor setting" to a file which can be double-clicked or dragged to WeSeeYou
- * or placed into your Startup Items folder to automatically call someone
- *
- * • Windows are auto-positioned to avoid overlap
- *
- * • An arbitary number of calls can be simultaneously handled at once
- *
- * • Calls are never merged into multi-party conferences
- *
- * • A lot of manual labor is expended getting the colored border positioned nicely
- */
-
- void main()
- {
- Initialize();
- EventLoop();
- StopMovieTalk();
- }
-
- void
- Initialize(
- void
- ){
- Handle menuBar;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- gSpyProcUPP = NewMTMediaProc(SpyProc);
- StartMovieTalk();
-
- menuBar = GetNewMBar(rGuardianMenuBar);
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(mApple), 'DRVR');
-
- DrawMenuBar();
-
- AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(HandleOAPP), 0, false);
- AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(HandleODOC), 0, false);
- AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(HandleQUIT), 0, false);
-
- SndNewChannel(&gSoundChannel, sampledSynth, initMono, 0);
- gBleepSound = GetResource('snd ', rBleepSound);
- HLockHi(gBleepSound);
- }
-
- void
- StartMovieTalk(
- void
- ){
- StringHandle sh;
-
- sh = GetString(kMTAppleTalkUserName);
-
- strncpy((char*)gUserName, (char*)*sh+1, **sh);
-
- gCC = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- MTConferenceSetMode(gCC, mtReceiveMediaModeMask);
- MTConferenceSetDefaultWindowProcID(gCC, zoomDocProc);
-
- MTConferenceListen(gCC, gUserName, gUserName, (MTCString)"mtlkatlk\tNoIncomingCalls\x0Dmtlktcpi\t606\x0Dmtlkisdn\t-\x0D");
-
- gGetInOnTheActionUPP = NewMTControllerActionFilterProc(GetInOnTheAction);
- MTConferenceSetDefaultActionFilter(gCC, gGetInOnTheActionUPP, 0);
-
- gBC = OpenDefaultComponent(kMTBrowserType, kMTAppleTalkSubType);
- }
-
- pascal OSErr
- HandleOAPP(
- AppleEventPtr /* unused */,
- AppleEventPtr /* unused */,
- long /* unused */
- ){
- return(noErr);
- }
-
- pascal OSErr
- HandleODOC(
- AppleEventPtr aev,
- AppleEventPtr /* unused */,
- long /* unused */
- ){
- AEDescList docs;
- long n, count;
- AEKeyword key;
- FSSpec fss;
- DescType type;
- Size size;
- OSErr err;
-
- if(err = AEGetParamDesc(aev, keyDirectObject, typeAEList, &docs))
- return(err);
-
- AECountItems(&docs, &count);
-
- for(n = 1; n <= count; n++)
- if(err = AEGetNthPtr(&docs, n, typeFSS, &key, &type, &fss, sizeof(FSSpec), &size))
- break;
- else
- FileCall(&fss);
-
- AEDisposeDesc(&docs);
-
- return(err);
- }
-
- void
- FileCall(
- FSSpecPtr fs
- ){
- int n, count;
- Handle h;
- MemberPtr mp;
- short id, refnum;
- ResType type;
- Str255 name;
-
- if(!(refnum = FSpOpenResFile(fs, fsRdPerm)))
- return;
-
- count = Count1Resources(kMTNameType);
-
- for(n = 1; n <= count; n++){
- h = Get1IndResource(kMTNameType, n);
- HLock(h);
-
- mp = CallOne((MTNamePtr) *h);
-
- GetResInfo(h, &id, &type, name);
-
- if(h = Get1Resource('RECT', id))
- mp->box = *(RectPtr) (*h);
- }
-
- CloseResFile(refnum);
- }
-
- pascal OSErr
- HandleQUIT(
- AppleEventPtr /* unused */,
- AppleEventPtr /* unused */,
- long /* unused */
- ){
- gQuitNow = true;
-
- return(noErr);
- }
-
- void
- EventLoop(
- void
- ){
- EventRecord tEvent;
- MTConferenceEvent cEvent;
-
- for(; !gQuitNow;){
- if(MTConferenceGetNextEvent(gCC, &cEvent))
- DoConferenceEvent(&cEvent);
-
- if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
- DoToolboxEvent(&tEvent);
-
- IntruderCheck();
- BleepAgain();
- }
- }
-
- void
- IntruderCheck(
- void
- ){
- MemberPtr mp;
- long now;
- Boolean bleep;
-
- now = TickCount();
-
- if(gCheckTime > now)
- return;
- gCheckTime = now + kCheckInterval;
-
- bleep = false;
-
- for(mp = (MemberPtr) gMembers.qHead; mp; mp = (MemberPtr) mp->qLink)
- if(ShouldBleep(mp))
- bleep = true;
-
- if(bleep == gBleeping)
- return;
- gBleeping = bleep;
-
- for(mp = (MemberPtr) gMembers.qHead; mp; mp = (MemberPtr) mp->qLink){
- SetPort((GrafPtr) MTControllerGetControllerPort(mp->controller));
- InvalRgn(mp->border);
- }
- }
-
- Boolean
- ShouldBleep(
- MemberPtr mp
- ){
- long on, off;
- int i;
-
- if(mp->sizes[kNewest] == 0){
- mp->bleeping = false;
-
- for(i = kNewest; i >= 0; i--)
- mp->sizes[i] = 0;
- }else if(mp->sizes[kBase]){
- on = (mp->sizes[kBase] * 150) / 100;
- off = mp->sizes[kBase];
-
- if(mp->sizes[kNewest] > on)
- mp->bleeping = true;
- else if(mp->sizes[kNewest] < off && mp->sizes[kPrevious] < off)
- mp->bleeping = false;
-
- if(mp->sizes[kOldest] > mp->sizes[kBase])
- mp->sizes[kBase] = ((3 * mp->sizes[kBase]) + mp->sizes[kOldest]) / 4;
- else
- mp->sizes[kBase] = (mp->sizes[kBase] + (3 * mp->sizes[kOldest])) / 4;
- }else
- mp->sizes[kBase] = mp->sizes[kOldest];
-
- for(i = kOldest; i <= kPrevious; i++)
- mp->sizes[i] = mp->sizes[i+1];
- mp->sizes[kNewest] = 0;
-
- return(mp->bleeping);
- }
-
- void
- BleepAgain(
- void
- ){
- long now;
-
- if(!gBleeping)
- return;
-
- now = TickCount();
-
- if(gBleepTime > now)
- return;
- gBleepTime = now + kBleepInterval;
-
- SndPlay(gSoundChannel, (SndListHandle)gBleepSound, true);
- }
-
- void
- DoToolboxEvent(
- EventRecordPtr ev
- ){
- switch(ev->what) {
- case mouseDown:
- DoMouseDownEvent(ev);
- break;
-
- case keyDown:
- DoKeyDownEvent(ev);
- break;
-
- case kHighLevelEvent:
- AEProcessAppleEvent(ev);
- break;
-
- case updateEvt:
- DoUpdateEvent(ev);
- break;
-
- case diskEvt:
- DoDiskEvent(ev);
- }
- }
-
- void
- DoMouseDownEvent(
- EventRecordPtr ev
- ){
- WindowPtr wp;
- short part;
-
- part = FindWindow(ev->where, &wp);
-
- switch(part){
- case inMenuBar:
- AdjustMenus();
- DoMenuBar(MenuSelect(ev->where));
- }
- }
-
- void
- DoKeyDownEvent(
- EventRecordPtr ev
- ){
- if(ev->modifiers & cmdKey){
- AdjustMenus();
- DoMenuBar(MenuKey(ev->message & charCodeMask));
- }
- }
-
- void
- DoUpdateEvent(
- EventRecordPtr ev
- ){
- MemberPtr mp;
- WindowPtr wp;
-
- wp = (WindowPtr) ev->message;
- SetPort(wp);
-
- BeginUpdate(wp);
-
- if(mp = FindMemberWindow(wp)){
- BackColor(mp->bleeping ? redColor : greenColor);
- EraseRgn(mp->border);
- BackColor(whiteColor);
- }
-
- EndUpdate(wp);
- }
-
- void
- DoDiskEvent(
- EventRecordPtr ev
- ){
- Point where;
-
- if(HiWord(ev->message)){
- SetPt(&where, kDILeft, kDITop);
- DIBadMount(where, ev->message);
- }
- }
-
- void
- AdjustMenus(
- void
- ){
- MenuHandle mh;
-
- mh = GetMHandle(mtFile);
-
- if(FrontWindow()){
- EnableItem(mh, itClose);
- EnableItem(mh, itSave);
- EnableItem(mh, itSaveAll);
- }else{
- DisableItem(mh, itClose);
- DisableItem(mh, itSave);
- DisableItem(mh, itSaveAll);
- }
- }
-
- void
- DoMenuBar(
- long selection
- ){
- short menuID;
- short menuItem;
-
- menuID = HiWord(selection);
- menuItem = LoWord(selection);
-
- switch(menuID){
- case mApple:
- DoAppleMenu(menuItem);
- break;
-
- case mtFile:
- DoFileMenu(menuItem);
- break;
-
- case mEdit: /* call SystemEdit for DA editing & MultiFinder */
- SystemEdit(menuItem-1);
- }
-
- HiliteMenu(0);
- }
-
- void
- DoAppleMenu(
- short item
- ){
- DialogRef dp;
- Str255 daName;
- short itemHit;
-
- switch(item){
- case iAbout:
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- SetDialogDefaultItem(dp, 1);
-
- ModalDialog(0, &itemHit);
-
- DisposeDialog(dp);
- break;
-
- default: /* all non-About items in this menu are DAs */
- GetItem(GetMHandle(mApple), item, daName);
- OpenDeskAcc(daName);
- }
- }
-
- void
- DoFileMenu(
- short item
- ){
- switch(item){
- case itNew:
- DoMenuCall();
- break;
-
- case itClose:
- DoMenuHangUp(FrontWindow());
- break;
-
- case itSave:
- DoMenuSave(1, kMTNameType, FrontWindow());
- break;
-
- case itSaveAll:
- DoMenuSave(2, kMTNameListType, 0);
- break;
-
- case itQuit:
- gQuitNow = true;
- }
- }
-
- void
- StopMovieTalk(
- void
- ){
- CloseComponent(gCC);
- CloseComponent(gBC);
- }
-
- void
- DoMenuCall(
- void
- ){
- MTNameListPtr names;
- MTNamePtr np;
- int count;
- ComponentResult err;
-
- err = MTBrowserBrowse(gBC, 0, "\pLets Monitor…", (MTCString)"mtlkatlk\tMulticaster\x0D", 0, &names);
-
- if(err)
- return;
-
- count = GetMTNameListCount(names);
- np = &(names->list[0]);
-
- while(--count >= 0)
- CallOne(np++);
-
- DisposeMTNameList(names);
- }
-
- MemberPtr
- CallOne(
- MTNamePtr np
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(0)))
- return(0);
-
- mp->member = MTConferenceCall(gCC, (MTCString)"Security Central", np);
- mp->box = gStandardScreen;
-
- return(mp);
- }
-
- void
- DoMenuHangUp(
- WindowPtr wp
- ){
- MemberPtr mp;
-
- if(mp = FindMemberWindow(wp))
- MTConferenceTerminate(gCC, MTConferenceGetMemberConference(gCC, mp->member));
- }
-
- void
- DoMenuSave(
- int note,
- ResType filetype,
- WindowPtr wp
- ){
- Handle h;
- short refnum;
- StandardFileReply reply;
- Str255 prompt, name;
-
- GetIndString(prompt, 401, note);
-
- if(wp)
- GetWTitle(wp, name);
- else
- GetIndString(name, 402, note);
-
- StandardPutFile(prompt, name, &reply);
-
- if(!reply.sfGood)
- return;
-
- if(reply.sfReplacing)
- FSpDelete(&reply.sfFile);
-
- FSpCreateResFile(&reply.sfFile, 'SW•7', filetype, reply.sfScript);
- if(!(refnum = FSpOpenResFile(&reply.sfFile, fsRdWrPerm)))
- return;
-
- if(wp)
- SaveScreen(wp);
- else
- for(wp = FrontWindow(); wp; wp = (WindowPtr) ((WindowPeek) wp)->nextWindow)
- SaveScreen(wp);
-
- h = GetResource('STR ', -16396);
- DetachResource(h);
- AddResource(h, 'STR ', -16396, "\p");
-
- CloseResFile(refnum);
- }
-
- void
- SaveScreen(
- WindowPtr wp
- ){
- MTNameListPtr nl;
- MemberPtr mp;
- Handle h;
- short id;
- Rect box;
-
- if(!(mp = FindMemberWindow(wp)))
- return;
-
- nl = MTConferenceGetReturnAddress(gCC, mp->member);
- PtrToHand((Ptr) nl->list, &h, sizeof(MTName));
- DisposeMTNameList(nl);
-
- id = UniqueID(kMTNameType);
-
- AddResource(h, kMTNameType, id, "\p");
-
- SetPort(wp);
- box = wp->portRect;
- LocalToGlobal((PointPtr) &box.top);
- LocalToGlobal((PointPtr) &box.bottom);
- box.bottom -= 16;
-
- PtrToHand((Ptr) &box, &h, sizeof(Rect));
- AddResource(h, 'RECT', id, "\p");
- }
-
- void
- DoConferenceEvent(
- MTConferenceEventPtr ce
- ){
- switch(ce->what){
- case mtConferenceReadyEvent:
- DoConfReady(ce);
- break;
-
- case mtMemberReadyEvent:
- DoMemberReady(ce);
- break;
-
- case mtMemberTerminatedEvent:
- DoMemberTerminated(ce);
- break;
-
- case mtMemberJoiningEvent:
- DoMemberJoining(ce);
- break;
-
- case mtPhoneRingingEvent:
- DoPhoneRinging(ce);
- break;
-
- case mtRefusedEvent:
- Sorry(701, 1, ce->who, ce->err);
- break;
-
- case mtFailedEvent:
- Sorry(701, 2, ce->who, ce->err);
- break;
-
- case mtSnapshotTakenEvent:
- SaveSnapshot(ce->surprise);
- break;
-
- case mtMovieRecordedEvent:
- SaveMovie(ce->surprise);
- }
-
- if(ce->surprise)
- DisposeHandle(ce->surprise);
- }
-
- void
- DoMemberJoining(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(mp = FindMember(0))
- mp->member = ce->who;
- else
- Sorry(702, 2, ce->who, 0);
- }
-
- void
- DoConfReady(
- MTConferenceEventPtr ce
- ){
- MTConferenceActivateConference(gCC, ce->who, 0);
- }
-
- void
- DoMemberReady(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
- MTControllerComponent mtc;
-
-
- if(ce->bonus & mtReceiveMediaModeMask){
- if(!(mp = FindMember(ce->who)))
- return;
-
- mtc = MTConferenceNewPreparedController(gCC, &mp->box,
- mtAutoPositionPrepMask+mtAuxiliaryClosePrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableSnapshotPrepMask+mtEnableRecordPrepMask,
- MTConferenceGetMemberName(gCC, mp->member));
- MTControllerSetControllerAttached(mtc, false);
-
- mp->controller = mtc;
-
- MTDirectorSetRecordProc(MTControllerGetStreamDirector(mtc), gSpyProcUPP, (long) mp);
- }else
- mtc = 0;
-
- MTConferenceActivateMember(gCC, ce->who, mtc);
- }
-
- pascal OSErr
- SpyProc(
- MTStreamChunkRecordPtr chunk
- ){
- MemberPtr mp;
-
- if(chunk->chunkError || chunk->chunkPriority != mtChunkPriorityVideo)
- return(noErr);
-
- mp = (MemberPtr) chunk->chunkRefCon;
-
- if(chunk->chunkSize > mp->sizes[kNewest])
- mp->sizes[kNewest] = chunk->chunkSize;
-
- return(noErr);
- }
-
- pascal Boolean
- GetInOnTheAction(
- MTControllerComponent mtc,
- MTControllerActionType action,
- VoidPtr params,
- long /* unused */
- ){
- MemberPtr mp;
- WindowPtr wp;
- MTDirectorComponent sd;
- RgnHandle rh;
- Rect old, new, box;
- MatrixRecord trix;
-
- if((action != mtControllerActionControllerSizeChanged) || !(mp = FindController(mtc)))
- return(false);
-
- if(*(BooleanPtr)params)
- MTControllerGetControllerBoundsRect(mtc, &old);
- else{
- rh = MTControllerGetControllerBoundsRgn(mtc);
- old = (*rh)->rgnBBox;
- InsetRect(&old, kBorderSize, kBorderSize);
- OffsetRect(&old, -kBorderSize, -kBorderSize);
- DisposeRgn(rh);
- }
- old.bottom -= kBarHeight;
-
- sd = MTControllerGetStreamDirector(mtc);
-
- MTDirectorChangedStreamFormats(sd, false);
-
- new = old;
- OffsetRect(&new, kBorderSize, kBorderSize);
- SetRect(&box, 0, new.bottom+kBorderSize, new.right+kBorderSize, new.bottom+kBorderSize+kBarHeight);
-
- MTControllerPositionController(mtc, &new, &box, 0);
- wp = (WindowPtr) MTControllerGetControllerPort(mtc);
- SizeWindow(wp, box.right, box.bottom, true);
-
- MTDirectorGetRect(sd, kMTAllStreams, &old);
- RectMatrix(&trix, &old, &new);
- MTDirectorSetMatrix(sd, kMTAllStreams, &trix);
-
- MTDirectorChangedStreamFormats(sd, true);
-
- mp->box = new;
- InsetRect(&new, -kBorderSize, -kBorderSize);
- RectRgn(mp->border, &new);
- rh = NewRgn();
- RectRgn(rh, &mp->box);
- XorRgn(rh, mp->border, mp->border);
- DisposeRgn(rh);
- SetPort(wp);
- InvalRgn(mp->border);
-
- return(true);
- }
-
- void
- DoMemberTerminated(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(ce->who)))
- return;
-
- if(mp->controller)
- MTConferenceDisposeController(gCC, mp->controller);
-
- Dequeue((QElemPtr) mp, &gMembers);
- DisposeRgn(mp->border);
- DisposePtr((Ptr) mp);
- }
-
- void
- DoPhoneRinging(
- MTConferenceEventPtr ce
- ){
- Handle ph;
-
- if((ce->bonus & mtRequiredMessagesModeMask) && Requires(ce->who, PW_CLEAR) && (ph = GetPassword((Ptr)MTConferenceGetMemberName(gCC, ce->who))))
- MTConferenceSendMessageToMember(gCC, ce->who, ph, PW_CLEAR, 1);
- }
-
- Boolean
- Requires(
- MTConferenceMember who,
- OSType type
- ){
- MTCapabilitiesHandle ch;
- MTCapabilitiesPtr cp;
- int n;
-
- ch = MTConferenceGetMemberMessageCapabilities(gCC, who);
-
- for(n = (*ch)->count, cp = (*ch)->capability; --n >= 0; cp++)
- if(type == cp->messageType && cp->desires == mtMessageRequiredCapability){
- DisposeHandle((Handle) ch);
- return(true);
- }
-
- DisposeHandle((Handle) ch);
- return(false);
- }
-
- Handle
- GetPassword(
- Ptr name
- ){
- DialogRef dp;
- short itemHit;
- Handle ph;
- Str255 p1;
-
- if(AEInteractWithUser(20*60, 0, 0))
- return(0);
-
- ParamText(nil, c2pstr(strcpy((char*)p1, name)), nil, nil);
- gPassword[0] = 0;
-
- dp = GetNewDialog(rPassword, 0, (WindowRef) -1);
- SetDialogDefaultItem(dp, diOK);
- SetDialogCancelItem(dp, diCancel);
- SetDialogTracksCursor(dp, true);
- PostEvent(keyDown, '\b'); // ick
-
- do{
- EnableButton(dp, diOK, gPassword[0]);
-
- ModalDialog(0, &itemHit);
-
- GetValue(gPassword, dp, diPassword);
- }while(itemHit > diCancel);
-
- DisposeDialog(dp);
- InitCursor();
-
- if(itemHit == diCancel)
- return(0);
-
- PtrToHand(gPassword, &ph, strlen((char*)gPassword)+1);
-
- return(ph);
- }
-
- void
- EnableButton(
- DialogRef dp,
- short item,
- Boolean enabled
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
-
- if(enabled)
- type &= ~itemDisable;
- else
- type |= itemDisable;
-
- HiliteControl((ControlHandle) ih, enabled ? 0 : 255);
-
- SetDialogItem(dp, item, type, ih, &rect);
-
- SetPort(dp);
- InsetRect(&rect, -5, -5);
- InvalRect(&rect);
- }
-
- void
- GetValue(
- BytePtr p,
- DialogRef dp,
- short item
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
- GetDialogItemText(ih, p);
-
- if(p[0] && p[p[0]] < ' '){
- p[0]--; // strip CR or other junk
- SetDialogItemText(ih, p);
- }
-
- p2cstr(p);
- }
-
- void
- SaveSnapshot(
- Handle pic
- ){
- ZeroScrap();
-
- HLock(pic);
-
- PutScrap(GetHandleSize(pic), 'PICT', *pic);
- }
-
- void
- SaveMovie(
- Handle h
- ){
- Ptr p;
- int i;
- long dirid;
- short vrefnum;
- FSSpecPtr temp;
- FSSpec spec;
- Str255 newname;
-
- HLock(h);
- temp =(FSSpecPtr) *h;
-
- FindFolder(kOnSystemDisk, kDesktopFolderType, true, &vrefnum, &dirid);
- FSMakeFSSpec(vrefnum, dirid, "\p", &spec);
- FSpCatMove(temp, &spec); // move it to the desktop
-
- FSMakeFSSpec(vrefnum, dirid, temp->name, &spec);
- GetIndString(newname, rWildSTRs, srMovieName);
- p = strchr((char*)newname, '?');
-
- for(i = 1; i < 10; i++){
- *p = '0'+i;
-
- if(FSpRename(&spec, newname) == noErr)
- return; // and give it a better name
- }
-
- SysBeep(1);
- }
-
- MemberPtr
- FindMember(
- MTConferenceMember who
- ){
- MemberPtr mp;
-
- if(who){
- for(mp = (MemberPtr) gMembers.qHead; mp; mp = (MemberPtr) mp->qLink)
- if(who == mp->member)
- return(mp);
- }else if(mp = (MemberPtr) NewPtrClear(sizeof(Member))){
- Enqueue((QElemPtr) mp, &gMembers);
- mp->border = NewRgn();
- }
-
- return(mp);
- }
-
- MemberPtr
- FindMemberWindow(
- WindowPtr wp
- ){
- MemberPtr mp;
- MTControllerComponent mtc;
-
- mtc = (MTControllerComponent) GetWRefCon(wp);
-
- for(mp = (MemberPtr) gMembers.qHead; mp; mp = (MemberPtr) mp->qLink)
- if(mtc == mp->controller)
- break;
-
- return(mp);
- }
-
- MemberPtr
- FindController(
- MTControllerComponent mtc
- ){
- MemberPtr mp;
-
- for(mp = (MemberPtr) gMembers.qHead; mp; mp = (MemberPtr) mp->qLink)
- if(mtc == mp->controller)
- break;
-
- return(mp);
- }
-
- void
- Sorry(
- int why,
- int note,
- MTConferenceMember who,
- OSErr err
- ){
- Str255 p1, p2, p3;
-
- if(AEInteractWithUser(20*60, 0, 0))
- return;
-
- GetIndString(p1, why, note);
-
- strcpy((char*)p2, (char*)MTConferenceGetMemberName(gCC, who));
- sprintf((char*)p3, "%d", err);
-
- ParamText(nil, p1, c2pstr((char*)p2), c2pstr((char*)p3));
-
- CautionAlert(why, 0);
- }